#!/bin/bash
# -*- coding: utf-8 -*-

# Auto-SSL 一键安装脚本
# 支持宝塔面板和通用环境的SSL证书自动化配置

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印函数
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_banner() {
    echo -e "${BLUE}"
    cat << "EOF"
╔══════════════════════════════════════════════════════════════╗
║                         Auto-SSL                             ║
║                   一键SSL证书自动化配置                        ║
║                 支持宝塔面板和Nginx通用环境                    ║
╚══════════════════════════════════════════════════════════════╝
EOF
    echo -e "${NC}"
}

# 检测Linux发行版
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$NAME
        VER=$VERSION_ID
    elif type lsb_release >/dev/null 2>&1; then
        OS=$(lsb_release -si)
        VER=$(lsb_release -sr)
    elif [ -f /etc/lsb-release ]; then
        . /etc/lsb-release
        OS=$DISTRIB_ID
        VER=$DISTRIB_RELEASE
    elif [ -f /etc/debian_version ]; then
        OS=Debian
        VER=$(cat /etc/debian_version)
    elif [ -f /etc/redhat-release ]; then
        OS=CentOS
        VER=$(rpm -q --queryformat '%{VERSION}' centos-release)
    else
        OS=$(uname -s)
        VER=$(uname -r)
    fi
}

# 检测宝塔面板
detect_baota() {
    if [ -d "/www/server/panel" ] && [ -f "/etc/init.d/bt" ]; then
        return 0
    else
        return 1
    fi
}

# 检查单个工具是否已安装
check_tool_installed() {
    local tool=$1
    case $tool in
        "nginx")
            # 检查Nginx是否已安装和运行
            if command -v nginx >/dev/null 2>&1; then
                print_success "Nginx 已安装"
                return 0
            elif systemctl is-active --quiet nginx 2>/dev/null; then
                print_success "Nginx 服务正在运行"
                return 0
            elif pgrep nginx >/dev/null 2>&1; then
                print_success "检测到 Nginx 进程正在运行"
                return 0
            else
                return 1
            fi
            ;;
        "certbot")
            if command -v certbot >/dev/null 2>&1; then
                print_success "Certbot 已安装"
                return 0
            else
                return 1
            fi
            ;;
        "python3")
            if command -v python3 >/dev/null 2>&1; then
                print_success "Python3 已安装"
                return 0
            else
                return 1
            fi
            ;;
        *)
            return 1
            ;;
    esac
}

# 安装缺失的依赖
install_missing_dependencies() {
    local missing_tools=()
    
    # 检查必要工具
    print_info "检查系统依赖..."
    
    if ! check_tool_installed "python3"; then
        missing_tools+=("python3")
    fi
    
    if ! check_tool_installed "certbot"; then
        missing_tools+=("certbot")
    fi
    
    if ! check_tool_installed "nginx"; then
        missing_tools+=("nginx")
    fi
    
    # 如果没有缺失的工具，直接返回
    if [ ${#missing_tools[@]} -eq 0 ]; then
        print_success "所有必要依赖都已安装"
        return 0
    fi
    
    print_info "需要安装以下工具: ${missing_tools[*]}"
    print_info "检测到操作系统: $OS $VER"
    
    case $OS in
        *"CentOS"*|*"Red Hat"*|*"AlmaLinux"*|*"Rocky"*)
            # 检测使用dnf还是yum
            if command -v dnf >/dev/null 2>&1; then
                PKG_MANAGER="dnf"
                print_info "使用 DNF 安装缺失的依赖..."
            else
                PKG_MANAGER="yum"
                print_info "使用 YUM 安装缺失的依赖..."
            fi
            
            for tool in "${missing_tools[@]}"; do
                case $tool in
                    "python3")
                        $PKG_MANAGER install -y python3 python3-pip
                        ;;
                    "nginx")
                        # 尝试多种安装方式
                        if $PKG_MANAGER install -y nginx; then
                            print_success "Nginx 通过 $PKG_MANAGER 安装成功"
                        elif $PKG_MANAGER install -y epel-release && $PKG_MANAGER install -y nginx; then
                            print_success "Nginx 通过EPEL源安装成功"
                        else
                            print_warning "包管理器安装失败，可能Nginx已通过其他方式安装"
                            print_info "如果Nginx确实未安装，请手动安装或检查软件源配置"
                        fi
                        ;;
                    "certbot")
                        $PKG_MANAGER install -y certbot
                        ;;
                esac
            done
            ;;
        *"Ubuntu"*|*"Debian"*)
            print_info "使用 APT 安装缺失的依赖..."
            apt update
            for tool in "${missing_tools[@]}"; do
                case $tool in
                    "python3")
                        apt install -y python3 python3-pip
                        ;;
                    "nginx")
                        apt install -y nginx
                        ;;
                    "certbot")
                        apt install -y certbot
                        ;;
                esac
            done
            ;;
        *)
            print_error "未识别的操作系统，请手动安装缺失的依赖: ${missing_tools[*]}"
            return 1
            ;;
    esac
    
    # 再次验证安装结果
    print_info "验证安装结果..."
    local install_failed=()
    for tool in "${missing_tools[@]}"; do
        if ! check_tool_installed "$tool"; then
            install_failed+=("$tool")
        fi
    done
    
    if [ ${#install_failed[@]} -gt 0 ]; then
        print_error "以下工具安装失败: ${install_failed[*]}"
        return 1
    else
        print_success "所有依赖安装完成"
        return 0
    fi
}

# 下载Auto-SSL脚本
download_auto_ssl() {
    local target_dir="/usr/local/bin"
    local script_url="https://gitee.com/tght1211/auto-ssl/raw/master/auto_ssl_universal.py"
    
    print_info "下载 Auto-SSL 脚本..."
    print_info "目标路径: $target_dir/auto_ssl_universal.py"
    
    # 创建临时目录
    local temp_dir=$(mktemp -d)
    cd "$temp_dir"
    print_info "临时下载目录: $temp_dir"
    
    # 下载主脚本
    if wget -q "$script_url" -O auto_ssl_universal.py; then
        print_success "脚本下载成功"
    else
        print_error "脚本下载失败，请检查网络连接"
        exit 1
    fi
    
    # 复制到系统目录
    print_info "复制脚本到系统目录: $target_dir/"
    cp auto_ssl_universal.py "$target_dir/"
    chmod +x "$target_dir/auto_ssl_universal.py"
    
    # 清理临时文件
    cd /
    rm -rf "$temp_dir"
    print_info "清理临时文件: $temp_dir"
    
    print_success "Auto-SSL 脚本安装完成: $target_dir/auto_ssl_universal.py"
}

# 创建命令行工具
create_cli_tool() {
    local cli_script="/usr/local/bin/auto-ssl"
    
    print_info "创建命令行工具..."
    print_info "CLI工具路径: $cli_script"
    
    # 清理可能存在的旧版本
    if [ -f "$cli_script" ]; then
        print_info "检测到旧版本CLI工具，正在更新: $cli_script"
        rm -f "$cli_script"
    fi
    
    # 检查目标目录权限
    if [ ! -w "/usr/local/bin" ]; then
        print_warning "没有写入 /usr/local/bin 的权限，跳过CLI工具创建"
        print_info "您可以直接使用完整路径：python3 /usr/local/bin/auto_ssl_universal.py"
        return 0  # 不是错误，只是跳过CLI工具创建
    fi
    
    # 创建CLI工具文件
    print_info "写入CLI工具内容到: $cli_script"
    
    # 使用简单可靠的方法创建文件
    {
        echo '#!/bin/bash'
        echo ''
        echo '# Auto-SSL 命令行工具'
        echo 'SCRIPT_PATH="/usr/local/bin/auto_ssl_universal.py"'
        echo ''
        echo 'show_help() {'
        echo '    echo "Auto-SSL - SSL证书自动化配置工具"'
        echo '    echo ""'
        echo '    echo "用法:"'
        echo '    echo "  auto-ssl              通用模式 (标准Nginx环境)"'
        echo '    echo "  auto-ssl bt           宝塔面板模式"'
        echo '    echo "  auto-ssl --help       显示帮助信息"'
        echo '    echo "  auto-ssl --version    显示版本信息"'
        echo '    echo ""'
        echo '    echo "示例:"'
        echo '    echo "  auto-ssl              # 为通用Nginx环境配置SSL"'
        echo '    echo "  auto-ssl bt           # 为宝塔面板环境配置SSL"'
        echo '}'
        echo ''
        echo 'show_version() {'
        echo '    echo "Auto-SSL v2.0.0"'
        echo '    echo "一键SSL证书自动化配置工具"'
        echo '}'
        echo ''
        echo '# 检查是否为root用户'
        echo 'check_root() {'
        echo '    if [ "$EUID" -ne 0 ]; then'
        echo '        echo "错误: 请使用root权限运行此命令"'
        echo '        echo "请使用: sudo auto-ssl $*"'
        echo '        exit 1'
        echo '    fi'
        echo '}'
        echo ''
        echo '# 主逻辑'
        echo 'case "$1" in'
        echo '    "bt")'
        echo '        check_root'
        echo '        echo "启动宝塔面板模式..."'
        echo '        if [ ! -f "$SCRIPT_PATH" ]; then'
        echo '            echo "错误: 脚本文件不存在: $SCRIPT_PATH"'
        echo '            echo "请重新运行安装: curl -sSL https://gitee.com/tght1211/auto-ssl/raw/master/install.sh | sudo bash"'
        echo '            exit 1'
        echo '        fi'
        echo '        export AUTO_SSL_MODE="baota"'
        echo '        shift  # 移除 "bt" 参数'
        echo '        python3 "$SCRIPT_PATH" "$@"'
        echo '        ;;'
        echo '    "--help"|"-h")'
        echo '        show_help'
        echo '        ;;'
        echo '    "--version"|"-v")'
        echo '        show_version'
        echo '        ;;'
        echo '    "")'
        echo '        check_root'
        echo '        echo "启动通用模式..."'
        echo '        if [ ! -f "$SCRIPT_PATH" ]; then'
        echo '            echo "错误: 脚本文件不存在: $SCRIPT_PATH"'
        echo '            echo "请重新运行安装: curl -sSL https://gitee.com/tght1211/auto-ssl/raw/master/install.sh | sudo bash"'
        echo '            exit 1'
        echo '        fi'
        echo '        export AUTO_SSL_MODE="generic"'
        echo '        python3 "$SCRIPT_PATH" "$@"'
        echo '        ;;'
        echo '    *)'
        echo '        # 处理其他参数，传递给 Python 脚本'
        echo '        check_root'
        echo '        echo "启动通用模式..."'
        echo '        if [ ! -f "$SCRIPT_PATH" ]; then'
        echo '            echo "错误: 脚本文件不存在: $SCRIPT_PATH"'
        echo '            echo "请重新运行安装: curl -sSL https://gitee.com/tght1211/auto-ssl/raw/master/install.sh | sudo bash"'
        echo '            exit 1'
        echo '        fi'
        echo '        export AUTO_SSL_MODE="generic"'
        echo '        python3 "$SCRIPT_PATH" "$@"'
        echo '        ;;'
        echo 'esac'
    } > "$cli_script"
    
    if [ $? -eq 0 ]; then
        print_success "CLI工具内容写入成功"
    else
        print_error "CLI工具内容写入失败"
        return 1
    fi

    # 设置可执行权限
    print_info "设置可执行权限: $cli_script"
    if ! chmod +x "$cli_script"; then
        print_error "设置可执行权限失败"
        return 1
    fi
    print_success "命令行工具创建完成: $cli_script"
    
    # 验证CLI工具是否可执行
    if [ -x "$cli_script" ]; then
        print_success "CLI工具验证通过，可以使用 'auto-ssl' 命令"
    else
        print_error "CLI工具创建失败，请检查权限"
    fi
}

# 创建系统服务配置
create_service_config() {
    print_info "创建配置目录..."
    
    local config_dir="/etc/auto-ssl"
    print_info "配置目录路径: $config_dir"
    mkdir -p "$config_dir"
    
    # 创建配置文件
    cat > "$config_dir/config.conf" << EOF
# Auto-SSL 配置文件
# 
# 宝塔面板路径配置
BAOTA_VHOST_PATH="/www/server/panel/vhost"
BAOTA_CERT_PATH="/www/server/panel/vhost/cert"
BAOTA_NGINX_PATH="/www/server/panel/vhost/nginx"
BAOTA_WEBROOT_PATH="/www/wwwroot"

# 通用Nginx路径配置
NGINX_CONF_PATH="/etc/nginx"
NGINX_SITES_PATH="/etc/nginx/sites-available"
NGINX_SITES_ENABLED="/etc/nginx/sites-enabled"
GENERIC_CERT_PATH="/etc/ssl/certs"
GENERIC_WEBROOT_PATH="/var/www"

# 证书配置
CERT_EMAIL="admin@localhost"
CERT_PROVIDER="letsencrypt"

# 日志配置
LOG_LEVEL="INFO"
LOG_FILE="/var/log/auto-ssl.log"
EOF

    print_success "配置文件创建完成: $config_dir/config.conf"
}

# 主安装流程
main() {
    print_banner
    
    # 检查root权限
    if [ "$EUID" -ne 0 ]; then
        print_error "请使用root权限运行安装脚本"
        print_info "请使用: sudo bash install.sh"
        exit 1
    fi
    
    print_info "开始安装 Auto-SSL..."
    
    # 检测操作系统
    detect_os
    
    # 检测宝塔面板
    if detect_baota; then
        print_info "检测到宝塔面板环境"
        ENVIRONMENT="baota"
    else
        print_info "检测到通用Nginx环境"
        ENVIRONMENT="generic"
    fi
    
    # 安装依赖
    install_missing_dependencies
    
    # 下载脚本
    download_auto_ssl
    
    # 创建CLI工具（如果有权限）
    create_cli_tool
    
    # 创建配置
    create_service_config
    
    # 最终验证安装
    print_info "验证安装完整性..."
    local verification_failed=0
    
    if [ ! -f "/usr/local/bin/auto_ssl_universal.py" ]; then
        print_error "主脚本未找到: /usr/local/bin/auto_ssl_universal.py"
        verification_failed=1
    fi
    
    # CLI工具是可选的，如果不存在也不算错误
    if [ -f "/usr/local/bin/auto-ssl" ]; then
        if [ ! -x "/usr/local/bin/auto-ssl" ]; then
            print_error "CLI工具不可执行: /usr/local/bin/auto-ssl"
            verification_failed=1
        else
            print_success "CLI工具验证通过"
        fi
    else
        print_info "CLI工具未创建（权限不足），将使用完整路径模式"
    fi
    
    if [ $verification_failed -eq 1 ]; then
        print_error "安装验证失败，请检查错误信息"
        exit 1
    fi
    
    print_success "安装验证通过！"
    print_success "Auto-SSL 安装完成！"
    echo ""
    print_info "使用方法:"
    
    # 根据CLI工具是否存在提供不同的使用说明
    if [ -f "/usr/local/bin/auto-ssl" ]; then
        print_info "方式一：使用CLI工具（推荐）"
        if [ "$ENVIRONMENT" = "baota" ]; then
            echo "  宝塔面板模式: auto-ssl bt"
        fi
        echo "  通用模式:     auto-ssl"
        echo "  查看帮助:     auto-ssl --help"
        echo ""
        print_info "方式二：使用完整路径"
        if [ "$ENVIRONMENT" = "baota" ]; then
            echo "  宝塔面板模式: python3 /usr/local/bin/auto_ssl_universal.py --mode baota"
        fi
        echo "  通用模式:     python3 /usr/local/bin/auto_ssl_universal.py --mode generic"
    else
        print_info "使用完整路径执行："
        if [ "$ENVIRONMENT" = "baota" ]; then
            echo "  宝塔面板模式: python3 /usr/local/bin/auto_ssl_universal.py --mode baota"
        fi
        echo "  通用模式:     python3 /usr/local/bin/auto_ssl_universal.py --mode generic"
        echo "  查看帮助:     python3 /usr/local/bin/auto_ssl_universal.py --help"
    fi
    echo ""
    print_info "现在您可以开始配置SSL证书了！"
}

# 执行主函数
main "$@"
